<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html>
  <head>    
    <title>Estructura BTP</title>    
    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
    <link href="../../styles.css" rel="stylesheet">
    <link rel="icon" href="../../images/icon.png">
	</head>
	<body>
		<div id="top">
      <h1>Estructura BTP</h1> 
		</div>
    <div id="main">
      <h2>Contenido</h2>
      <div class="contents">
        <ol>        
          <li><a href="#intro">Introducci&oacute;n</a></li>
          <li><a href="#func">Funcionamiento</a></li>
          <li><a href="#defs">Definiciones</a></li>
          <li><a href="#struct">Estructura</a></li>
          <li><a href="#example">Ejemplo</a></li>
        </ol>
      </div>
      <h2 id="intro">Introducci&oacute;n</h2>
      <div class="contents">
        <p>El tipo de archivo <b>BTP</b> es un archivo que se puede conseguir en SMG. Este se encarga de guardar la informaci&oacute;n para una animaci&oacute;n de <i>cambio de texturas/im&aacute;genes</i>. B&aacute;sicamente, especifica como la imagen que se muestra sobre la superficie de un modelo en 3D va a cambiar por otra en funci&oacute;n del tiempo (la unidad de tiempo es en cuadros). Un ejemplo de su uso es en el modelo de Mario para animar el parpadeo.</p>
        <br>
        <img style="width: 70%;" src="../../images/btp/mario_iceflick.gif" alt="Image could not be loaded.">
        <p class="idtext">Vid. 1: <code>mario.bdl</code> con la animaci&oacute;n <code>iceflick.btp</code> vista en <code>j3dview</code></p>
        <br>
      </div>
      <h2 id="func">Funcionamiento</h2>
      <div class="contents">
        <p>Los modelos 3D son visibles gracias a los <i>materiales</i> que estan aplicados en sus superficies y ellos son solo una forma de especificar como una superficie ha de ser vista desde un punto en el espacio. Los materiales estan compuestos por im&aacute;genes o texturas que ayudan a mostrar el efecto final deseado en la superficie. Estas texturas se mapean directamente sobre las superficies y son, en general, lo que uno espera ver en el modelo en 3D al ser mostrado en el juego.</p>
        <br>
        <img src="../../images/btp/func1.gif">
        <p class="idtext">Vid. 2: Imagen de Duolingo mapeada en un cubo de Blender.</p>
        <br>
        <p>Los modelos 3D de SMG guardan las texturas que los materiales usan en <i>una especie de arreglo</i>, por lo que las texturas tienen &iacute;ndices (n&uacute;meros enteros) asociados a trav&eacute;s de los cuales se les puede referenciar.</p>
        <br>
        <img src="../../images/btp/func2.png">
        <p class="idtext">Fig. 1: Visualizaci&oacute;n de como se almacenan las texturas en un modelo 3D de SMG.</p>
        <br>
        <p>Lo que hace el archivo BTP es especificar el &iacute;ndice de la textura a mostrar en un material en cada cuadro de una animaci&oacute;n. De otra forma, en cada cuadro de una animaci&oacute;n BTP se va a mostrar una textura, especificada con un entero, sobre un material del modelo 3D.</p> 
        <br>
        <img src="../../images/btp/func3.png">
        <p class="idtext">Fig. 2: Visualizaci&oacute;n de una animaci&oacute;n BTP.</p>
        <br>       
      </div>
      <h2 id="defs">Definiciones</h2>
      <div class="contents">
        <ul>
          <li><b>Secci&oacute;n TPT1</b>: &uacute;nica secci&oacute;n de los archivos BTP que contiene todos los datos de la animaci&oacute;n de cambio de texturas.</li>
          <li>
            <p><b>Modo de repetici&oacute;n</b>: Entero de 8 bits que especifica como se repite la animaci&oacute;n. Las opciones son:</p>
            <ul>
              <li><b>0</b>: Se reproduce la animaci&oacute;n una sola vez y se mantiene el &uacute;ltimo cuadro de la animaci&oacute;n cargado en el modelo.</li>
              <li><b>1</b>: Se reproduce la animaci&oacute;n una sola vez y se mantiene el primer cuadro de la animaci&oacute;n cargado en el modelo.</li>
              <li><b>2</b>: Se reproduce la animaci&oacute;n infinitas veces hacia adelante.</li>
              <li><b>3</b>: Se reproduce la animaci&oacute;n una vez hacia adelante y una vez hacia atr&aacute;s.</li>
              <li><b>4</b>: Se reproduce la animaci&oacute;n infinitas veces hacia adelante y hacia atr&aacute;s.</li>
            </ul>
          </li>
          <li>
            <p><b>Duraci&oacute;n de la animaci&oacute;n</b>: Entero de 16 bits que indica la duraci&oacute;n de la animaci&oacute;n de cambio de texturas. Este n&uacute;mero dice que tantos datos de la animaci&oacute;n de cada material usar.</p>
            <br>
            <img src="../../images/btp/anim_length.png">
            <p class="idtext">Fig. 3: Diagrama que muestra los datos de &iacute;ndices de texturas para distintos materiales, c&oacute;mo son afectados por la duraci&oacute;n de la animaci&oacute;n y c&oacute;mo estos datos se almacenan en la tabla de &iacute;ndices de texturas.</p>
            <br>
            <ul>
              <li><b>Si faltan datos de animaci&oacute;n, para un material:</b> Se agarra el valor del &uacute;ltimo cuadro disponible y se mantiene hasta el final de la animaci&oacute;n.</</li>
              <li><b>Si sobran datos de animaci&oacute;n para un material:</b> Se agarran los datos hasta que se termine la animaci&oacute;n (se ignoran los datos posteriores).</li>
            </ul>
          </li>
        </ul>
      </div>
      <h2 id="struct">Estructura</h2>
      <div class="contents">
        <p><b>Encabezado</b></p>
        <br>
        <table>
          <tr>
            <th>Nombre</th>
            <th>Tama&ntilde;o</th>
            <th>Descripci&oacute;n</th>
          </tr>
          <tr>
            <td>Magia</td>
            <td>4 bytes</td>
            <td><code>J3D1</code> (Big Endian) o <code>1D3J</code> (Little Endian).</td>
          </tr>
          <tr>
            <td>Tipo</td>
            <td>4 bytes</td>
            <td><code>btp1</code> (Big Endian) o <code>1ptb</code> (Little Endian).</td>
          </tr>
          <tr>
            <td>Tama&ntilde;o del archivo</td>
            <td>4 bytes</td>
            <td>En bytes.</td>
          </tr>
          <tr>
            <td style="white-space: nowrap">N&uacute;mero de secciones</td>
            <td>4 bytes</td>
            <td>Parece ser siempre <code>0x1</code>.</td>
          </tr>
          <tr>
            <td>Desconocido 1</td>
            <td >16 bytes</td>
            <td>Parecen ser siempre 16 <code>0xFF</code> bytes.</td>
          </tr>
        </table>
        <br>
        <p><b>Secci&oacute;n TPT1</b></p>
        <br>
         <table>
          <tr>
            <th>Nombre</th>
            <th>Tama&ntilde;o</th>
            <th>Descripci&oacute;n</th>
          </tr>
          <tr>
            <td>Magia</td>
            <td>4 bytes</td>
            <td><code>TPT1</code> (Big Endian) o <code>1TPT</code> (Little Endian).</td>
          </tr>
          <tr>
            <td>Tama&ntilde;o de la secci&oacute;n</td>
            <td>4 bytes</td>
            <td>En bytes.</td>
          </tr>
          <tr>
            <td>Modo de repetici&oacute;n</td>
            <td>1 byte</td>
            <td><code>0x00</code>, <code>0x01</code>, <code>0x02</code>, <code>0x03</code> o <code>0x04</code>.</td>
          </tr>
          <tr>
            <td>Desconocido 1</td>
            <td>1 byte</td>
            <td>Parece ser siempre <code>0xFF</code>.</td>
          </tr>
          <tr>
            <td>Duraci&oacute;n de la animaci&oacute;n</td>
            <td>2 bytes</td>
            <td>Especificada en cuadros.</td>
          </tr>
          <tr>
            <td>N&uacute;mero de materiales</td>
            <td>2 bytes</td>
            <td>N&uacute;mero de materiales en el archivo BTP para animar.</td>
          </tr>
          <tr>
            <td>Tama&ntilde;o del arreglo de &iacute;ndices de texturas</td>
            <td>2 bytes</td>
            <td>Longitud del arreglo en donde se guardan los &iacute;ndices de las texturas para cada material.</td>
          </tr>
          <tr>
            <td>Posici&oacute;n de los datos de animaci&oacute;n de cada material</td>
            <td>4 bytes</td>
            <td>Respecto al inicio de la secci&oacute;n. Parece ser siempre <code>0x20</code>.</td>
          </tr>
          <tr>
            <td>Posici&oacute;n del arreglo de &iacute;ndices de texturas</td>
            <td>4 bytes</td>
            <td>Respecto al inicio de la secci&oacute;n. Este arreglo contiene los &iacute;ndices de las texturas que se mostrar&aacute;n en cada material.</td>
          </tr>
          <tr>
            <td>Posici&oacute;n del arreglo de &iacute;ndices de materiales</td>
            <td>4 bytes</td>
            <td>Respecto al inicio de la secci&oacute;n. Este arreglo contiene la ubicaci&oacute;n de cada material animado en el modelo 3D en forma de &iacute;ndices.</td>
          </tr>
          <tr>
            <td>Posici&oacute;n de la tabla de nombres de los materiales</td>
            <td>4 bytes</td>
            <td>Respecto al inicio de la secci&oacute;n. Esta tabla contiene los nombres de los materiales a animar.</td>
          </tr>
          <tr style="background-color: #EEEEEE;">
            <td><b>Inicio:</b> Datos de animaci&oacute;n de cada material</td>
            <td colspan="2">(8 * Número de materiales) bytes</td>
          </tr>
          <tr style="background-color: #EEEEEE;">
            <td colspan="3">
              <table style="margin-left: 2%; width: 98%;">
                <tr>
                  <td>Longitud[i]</td>
                  <td style="white-space: nowrap">2 bytes</td>
                  <td>Tama&ntilde;o del sub-arreglo de &iacute;ndices de texturas que le corresponde al i-&eacute;simo material.</td>
                </tr>
                <tr>
                  <td>&Iacute;ndice[i]</td>
                  <td>2 bytes</td>
                  <td>Posici&oacute;n del sub-arreglo de &iacute;ndices de texturas del i-&eacute;simo material dentro del arreglo de &iacute;ndice de texturas.</td>
                </tr>
                <tr>
                  <td style="white-space: nowrap">Desconocido 2</td>
                  <td>4 bytes</td>
                  <td>Parece ser siempre <code>0x00FFFFFF</code>. No es afectado por el ordenamiento de los bytes (Endian).</td>
                </tr>
              </table>
            </td>
          </tr>
          <tr style="background-color: #EEEEEE;">
            <td colspan="3"><b>Final:</b> Datos de animaci&oacute;n de cada material</td>
          </tr>
          <tr style="background-color: #EEEEEE;">
            <td><b>Inicio:</b> Arreglo de &iacute;ndices de texturas</td>
            <td colspan="2">
              <ul>
                <li>(2 * La m&aacute;xima suma de: &Iacute;ndice[i] + Longitud[i]) bytes</li>
                <li>(2 * Tama&ntilde;o del arreglo de &iacute;ndices de texturas) bytes</li>
              </ul>
            </td>
          </tr>
          <tr style="background-color: #EEEEEE;">
            <td colspan="3">
              <table style="margin-left: 2%; width: 98%;">
                <tr>
                  <td>&iacute;ndice de textura[i]</td>
                  <td>2 bytes</td>
                  <td>i-&eacute;simo &iacute;ndice de textura en la tabla de &iacute;ndices de texturas.</td>
                </tr>
              </table>
            </td>
          </tr>
          <tr style="background-color: #EEEEEE;">
            <td colspan="3"><b>Final:</b> Arreglo de &iacute;ndices de texturas</td>
          </tr>
          <tr>
            <td>Relleno 1</td>
            <td><a href="common.html#padding">M&aacute;ximo 3 bytes</a></td>
            <td>Alinea hasta el siguiente byte multiplo de 4.</td>
          </tr>
          <tr style="background-color: #EEEEEE;">
            <td><b>Inicio:</b> Arreglo de &iacute;ndices de materiales</td>
            <td colspan="2">(2 * N&uacute;mero de materiales) bytes</td>
          </tr>
          <tr style="background-color: #EEEEEE;">
            <td colspan="3">
              <table style="margin-left: 2%; width: 98%;">
                <tr>
                  <td>&iacute;ndice de material[i]</td>
                  <td>2 bytes</td>
                  <td>El &iacute;ndice, del i-&eacute;simo material en el archivo BTP, en el modelo 3D.</td>
                </tr>
              </table>
            </td>
          </tr>
          <tr style="background-color: #EEEEEE;">
            <td colspan="3"><b>Final:</b> Arreglo de &iacute;ndices de materiales</td>
          </tr>
          <tr>
            <td>Relleno 2</td>
            <td><a href="common.html#padding">M&aacute;ximo 3 bytes</a></td>
            <td>Alinea hasta el siguiente byte multiplo de 4.</td>
          </tr>
          <tr>
            <td>Tabla de nombres de los materiales</td>
            <td><a href="common.html#name-table">Variable</a></td>
            <td>Tabla que contiene los nombres de los materiales que se van a animar del modelo en 3D.</td>
          </tr>
          <tr>
            <td>Relleno 3</td>
            <td style="white-space: nowrap"><a href="common.html#padding">M&aacute;ximo 31 bytes</a></td>
            <td>Alinea hasta el siguiente byte multiplo de 32.</td>
          </tr>
        </table>
      </div>
      <h2 id="example">Ejemplo</h2>
      <div class="contents">
        <p>Estructura coloreada de <code>iceflick.btp</code> en ImHex:</p>
        <br>
        <img src="../../images/btp/example.png">
        <br>
        <p>El archivo se encuentra en <code>ObjectData/MarioAnime.arc</code>.</p>
      </div>
      <h2 id="refs">Referencias</h2>
      <div class="contents">
        <ul>
          <li><a href="https://wiki.cloudmodding.com/zgcn/BTP">https://wiki.cloudmodding.com/zgcn/BTP</a></li>
        </ul>
      </div>
    </div>
	</body>
</html>
